<?php

namespace Org\Util;

class UcClient {
	//Api Server 地址
	protected $host;
	//通信密钥
	protected $key;
	//默认过期时间
	protected $expire;
	function __construct($host = 'http://localhost/TPUc/webroot/index.php/Home/Index/',$key = '15FejiofaewjfioewoIOEFJeiowjeioawfji23FefioFJIefoEFiojFWOeifjIO4',$expire=0) {
		$this->host = $host;
		$this->key = $key;
		$this->expire = $expire;
	}
	/**
	 * 用户注册
	 *
	 * 本接口函数用于新用户的注册。用户名、密码、Email 为一个用户在 UCenter 的基本数据，提交后 UCenter
	 * 会按照注册设置和词语过滤的规则检测用户名和 Email 的格式是否正确合法，如果正确则返回注册后的用户 ID，否则返回相应的错误信息。
	 *
	 * @param string $username
	 *            用户名
	 * @param string $password
	 *            密码
	 * @param string $email
	 *            电子邮件
	 * @param integer $questionid
	 *            安全提问索引
	 * @param string $answer
	 *            安全提问答案
	 * @return mixed 大于 0:返回用户 ID，表示用户注册成功
	 *         -1:用户名不合法
	 *         -2:包含不允许注册的词语
	 *         -3:用户名已经存在
	 *         -4:Email 格式有误
	 *         -5:Email 不允许注册
	 *         -6:该 Email 已经被注册
	 */
	function uc_user_register($username, $password, $email, $questionid = '', $answer = '') {
		$url = $this->host . "uc_user_register";
		$data = array (
			'username'=>$username,
				'password'=>$password,
				'email'=>$email,
				'questionid'=>$questionid,
				'answer'=>$answer,
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 用户登录
	 *
	 * @param string $username
	 *        	用户名 post
	 * @param string $password
	 *        	用户登录密码 post
	 * @param number $isuid
	 *        	是否使用uid登陆，默认为否，值为0，post
	 * @param number $checkques
	 *        	是否验证安全提问 默认为否
	 * @param number $questionid
	 *        	安全提问编号 number
	 * @param string $answer
	 *        	安全提问答案 string
	 * @return integer [0]	大于 0:返回用户 ID，表示用户登录成功
	 *         -1:用户不存在，或者被删除
	 *         -2:密码错误
	 *         -3:安全提问错误
	 *         string [1]	用户名
	 *         string [2]	密码
	 *         string [3]	Email
	 *         bool [4]	用户名是否重名
	 *         示例：
	 *
	 *         {"is_repet":0,"email":"15648@qq.com","password":"fjowiei","username":"fwjeiojwie","uid":"1"}
	 *         用户名未重复，电子邮件地址，密码，用户名，uid
	 */
	function uc_user_login($username, $password, $isuid = 0, $checkques = 0,
        $questionid = '', $answer = '')
	{
		$url = $this->host . "uc_user_login";
		$data = array(
			'username'=>$username,
				'password'=>$password,
				'isuid'=>$isuid,
				'checkques'=>$checkques,
				'questionid'=>$questionid,
				'answer'=>$answer
		);
		return $this->curl($url, $data);
	}
	
	
	/**
	 * 获取用户数据
	 *
	 * @param string $username
	 *        	用户名 post
	 * @param bool $isuid
	 *        	是否使用用户 ID获取 post
	 *        	1:使用用户 ID获取
	 *        	0:(默认值) 使用用户名获取
	 * @return integer [0]	用户 ID
	 *         string [1]	用户名
	 *         string [2]	Email
	 *         示例：
	 *
	 *         {"email":"807572915@qq.com","username":"wutian","id":"3"}
	 *         电子邮箱地址，用户名，用户ID号
	 */
	function uc_get_user ($username, $isuid = 0)
	{
		$url = $this->host . "uc_get_user";
		$data = array(
			'username'=>$username,
				'isuid'=>$isuid,
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 更新用户资料
	 *
	 * @param string $username;
	 *        	用户名 post
	 * @param string $oldpw;
	 *        	旧密码 post
	 * @param string $newpw
	 *        	新密码 post
	 * @param string $email;
	 *        	电子邮箱地址 post
	 * @param bool $ignoreoldpw
	 *        	是否忽略旧密码 默认值 0,不忽略，更改资料需要验证密码
	 * @param number $questionid
	 *        	安全提问索引 post
	 * @param string $answer
	 *        	安全提问答案 post
	 * @return integer 1:更新成功
	 *         0:没有做任何修改
	 *         -1:旧密码不正确
	 *         -4:Email 格式有误
	 *         -5:Email 不允许注册
	 *         -6:该 Email 已经被注册
	 *         -7:没有做任何修改
	 *         -8:该用户受保护无权限更改
	 *         示例：
	 *
	 *
	 */
	function uc_user_edit ($username, $oldpw, $newpw, $email, $ignoreoldpw = 0,
	$questionid = '', $answer = '')
	{
		$url = $this->host . "uc_user_edit";
		$data = array(
				'username'=>$username,
				'oldpw'=>$oldpw,
				'newpw'=>$newpw,
				'email'=>$email,
				'ignoreoldpw'=>$ignoreoldpw,
				'questionid'=>$questionid,
				'answer'=>$answer
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 删除用户
	 *
	 * @param integer $uid;
	 *        	用户名 post
	 * @return integer 1:成功
	 *         0：失败
	 *         示例：
	 *
	 *
	 */
	function uc_user_delete ($uid)
	{
		$url = $this->host . "uc_user_delete";
		$data = array(
				'uid'=>$uid
				);
		return $this->curl($url, $data);
	}
	
	/**
	 * 删除用户头像
	 *
	 * @param integer $uid;
	 *        	用户名 post
	 * @return integer 1:成功
	 *         0：失败
	 */
	function uc_user_deleteavatar($uid)
	{
		$url = $this->host . "uc_user_deleteavatar";
		$data = array(
				'uid'=>$uid
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 同步登录
	 *
	 * @param integer $uid;
	 *        	用户ID post
	 * @return string 同步登录的 HTML 代码
	 *         示例：
	 *
	 *
	 */
	function uc_user_synlogin($uid)
	{
		$url = $this->host . "uc_user_synlogin";
		$data = array(
				'uid'=>$uid
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 同步退出
	 *
	 * @return string 同步退出的 HTML 代码
	 *         示例：
	 *
	 */
	function uc_user_synlogout()
	{
		$url = $this->host . "uc_user_synlogout";
		$data = '';
		return $this->curl($url, $data);
	} 
	
	/**
	 * 检查 Email 地址
	 *
	 * @param string $email
	 *        	邮箱地址 post
	 * @return integer 1:成功
	 *         -4:Email 格式有误
	 *         -5:Email 不允许注册
	 *         -6:该 Email 已经被注册
	 *         示例：
	 *
	 *
	 */
	function uc_user_checkemail($email)
	{
		$url = $this->host . "uc_user_checkemail";
		$data = array(
				'email'=>$email
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 检查用户名
	 *
	 * @param string $username;
	 *        	用户名 post
	 * @return integer 1:成功
	 *         -1:用户名不合法
	 *         -2:包含要允许注册的词语
	 *         -3:用户名已经存在
	 *         示例：
	 *
	 */
	function uc_user_checkname($username)
	{
		$url = $this->host . "uc_user_checkname";
		$data = array(
				'username'=>$username
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 添加保护用户
	 *
	 * @param string $username;
	 *        	用户名 post
	 * @param string $admin
	 *        	操作的管理员 post
	 * @return integer 1:成功
	 *         0：失败
	 *         示例：
	 */
	function uc_user_addprotected($username, $admin = '')
	{
		$url = $this->host . "uc_user_addprotected";
		$data = array(
				'username'=>$username,
				'admin'=>$admin
		);
		return $this->curl($url, $data);
	}
	
	
	/**
	 * 删除保护用户
	 *
	 * @return integer 1:成功
	 *         -1：失败
	 *         示例：
	 *
	 */
	function uc_user_deleteprotected($username)
	{
		$url = $this->host . "uc_user_deleteprotected";
		$data = array(
				'username'=>$username
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 得到受保护的用户名列表
	 *
	 * @return array 受保护的用户数据
	 *         示例：
	 *
	 */
	function uc_user_getprotected()
	{
		$url = $this->host . "uc_user_getprotected";
		$data = '';
		return $this->curl($url, $data);
	}
	
	/**
	 * 把重名用户合并到 UCenter
	 *
	 * @param string $username
	 *        	老用户名 post
	 * @param string $newusername
	 *        	新用户名 post
	 * @param integer $uid;
	 *        	用户ID post
	 * @param string $password
	 *        	密码 post
	 * @param string $email
	 *        	电子邮箱地址 post
	 * @return integer 大于 0:返回用户 ID，表示用户注册成功
	 *         -1:用户名不合法
	 *         -2:包含不允许注册的词语
	 *         -3:用户名已经存在
	 *         示例：
	 *
	 */
	function uc_user_merge($oldusername, $newusername, $uid, $password, $email)
	{
		$url = $this->host . "uc_user_merge";
		$data = array(
				'oldusername'=>$oldusername,
				'newusername'=>$newusername,
				'uid'=>$uid,
				'password'=>$password,
				'email'=>$email	
		);
		return $this->curl($url, $data);
	}
	
	/**
	 * 移除重名用户记录
	 *
	 * @param string $username
	 * @return mixed
	 */
	function uc_user_merge_remove($username)
	{
		$url = $this->host . "uc_user_merge_remove";
		$data = array(
				'username'=>$username
		);
		return $this->curl($url, $data);
	}
	
	
	/**
	 * 获取指定应用的指定用户积分
	 *
	 * @param integer $appid
	 *        	应用ID post
	 * @param integer $uid
	 *        	用户ID post
	 * @param integer $credit
	 *        	积分编号 post
	 * @return integer 积分
	 *         示例：
	 */
	function uc_user_getcredit($appid, $uid, $credit)
	{
		$url = $this->host . "uc_user_getcredit";
		$data = array(
				'appid'=>$appid,
				'uid'=>$uid,
				'credit'=>$credit	
		);
		return $this->curl($url, $data);
	}
	
	
	private  function curl($url, $data, $method = "post") {
		$data = $this->uc_authcode(json_encode($data),'ENCODE',$this->key,$this->expire);
		dump($data);
		$curl = curl_init (); 
		curl_setopt ( $curl, CURLOPT_URL, $url ); 
		if ($method === "post") {
			curl_setopt ( $curl, CURLOPT_POST, 1 );
			curl_setopt ( $curl, CURLOPT_POSTFIELDS, array('d'=>$data )); 
		}
		curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, 1 ); // 设置cURL 参数，要求结果保存到字符串中还是输出到屏幕上
		$result = curl_exec ( $curl ); // 运行CURL，请求网页
		curl_close ( $curl ); // 关闭URL
		return $result;
	}
	
	function uc_authcode ($string, $operation = 'DECODE', $key = '', $expiry = 0)
	{
		$ckey_length = 4;
	
		$key = md5($key ? $key : $this->key);
		$keya = md5(substr($key, 0, 16));
		$keyb = md5(substr($key, 16, 16));
		$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0,
				$ckey_length) : substr(md5(microtime()), - $ckey_length)) : '';
	
		$cryptkey = $keya . md5($keya . $keyc);
		$key_length = strlen($cryptkey);
	
		$string = $operation == 'DECODE' ? base64_decode(
				substr($string, $ckey_length)) : sprintf('%010d',
						$expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) .
						$string;
		$string_length = strlen($string);
	
		$result = '';
		$box = range(0, 255);
	
		$rndkey = array();
		for ($i = 0; $i <= 255; $i ++) {
			$rndkey[$i] = ord($cryptkey[$i % $key_length]);
		}
	
		for ($j = $i = 0; $i < 256; $i ++) {
			$j = ($j + $box[$i] + $rndkey[$i]) % 256;
			$tmp = $box[$i];
			$box[$i] = $box[$j];
			$box[$j] = $tmp;
		}
	
		for ($a = $j = $i = 0; $i < $string_length; $i ++) {
			$a = ($a + 1) % 256;
			$j = ($j + $box[$a]) % 256;
			$tmp = $box[$a];
			$box[$a] = $box[$j];
			$box[$j] = $tmp;
			$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
		}
	
		if ($operation == 'DECODE') {
			if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr(
					$result, 10, 16) ==
					substr(md5(substr($result, 26) . $keyb), 0, 16)) {
				return substr($result, 26);
			} else {
				return '';
			}
		} else {
			return $keyc . str_replace('=', '', base64_encode($result));
		}
	}
}
